home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / PROGRAMM / ASSEMBLE / H145.ZIP / ASXXXX_3.ZIP / M01MCH.C < prev    next >
C/C++ Source or Header  |  1990-07-18  |  4KB  |  308 lines

  1. /* m01mch.c */
  2.  
  3. /*
  4.  * (C) Copyright 1989,1990
  5.  * All Rights Reserved
  6.  *
  7.  * Alan R. Baldwin
  8.  * 721 Berkeley St.
  9.  * Kent, Ohio  44240
  10.  */
  11.  
  12. #include <stdio.h>
  13. #include <setjmp.h>
  14. #include "asm.h"
  15. #include "m6801.h"
  16.  
  17. int    hd63;
  18.  
  19. /*
  20.  * Process a machine op.
  21.  */
  22. VOID
  23. machine(mp)
  24. struct mne *mp;
  25. {
  26.     register op, t1;
  27.     struct expr e1, e2;
  28.     struct area *espa;
  29.     char id[NCPS];
  30.     int c, v1, reg;
  31.  
  32.     reg = 0;
  33.     op = mp->m_valu;
  34.     switch (mp->m_type) {
  35.  
  36.     case S_SDP:
  37.         e1.e_mode = 0;
  38.         e1.e_flag = 0;
  39.         e1.e_addr = 0;
  40.         e1.e_base.e_ap = NULL;
  41.         espa = NULL;
  42.         if (more()) {
  43.             expr(&e1, 0);
  44.             if (e1.e_flag == 0 && e1.e_base.e_ap == NULL) {
  45.                 if (e1.e_addr) {
  46.                     err('b');
  47.                 }
  48.             }
  49.             if ((c = getnb()) == ',') {
  50.                 getid(id, -1);
  51.                 espa = alookup(id);
  52.                 if (espa == NULL) {
  53.                     err('u');
  54.                 }
  55.             } else {
  56.                 unget(c);
  57.             }
  58.         }
  59.         if (espa) {
  60.             outdp(espa, &e1);
  61.         } else {
  62.             outdp(dot.s_area, &e1);
  63.         }
  64.         lmode = SLIST;
  65.         break;
  66.  
  67.     case S_HD63:
  68.         ++hd63;
  69.         break;
  70.  
  71.     case S_INH63:
  72.         if (!hd63) {
  73.             err('o');
  74.             break;
  75.         }
  76.  
  77.     case S_INH:
  78.         outab(op);
  79.         break;
  80.  
  81.     case S_TYP63:
  82.         if (!hd63) {
  83.             err('o');
  84.             break;
  85.         }
  86.         if (getnb() != '#')
  87.             aerr();
  88.         expr(&e2, 0);
  89.         comma();
  90.         t1 = addr(&e1);
  91.         if (t1 == S_DIR) {
  92.             outab(op|0x10);
  93.             outrb(&e2, 0);
  94.             outrb(&e1, R_PAG0);
  95.             break;
  96.         }
  97.         if (t1 == S_INDX) {
  98.             outab(op);
  99.             outrb(&e2, 0);
  100.             outrb(&e1, R_USGN);
  101.             break;
  102.         }
  103.         aerr();
  104.         break;
  105.  
  106.     case S_PUL:
  107.         v1 = admode(abdx);
  108.         if (v1 == S_A) {
  109.             outab(op);
  110.             break;
  111.         }
  112.         if (v1 == S_B) {
  113.             outab(op+1);
  114.             break;
  115.         }
  116.         if (v1 == S_X) {
  117.             outab(op+6);
  118.             break;
  119.         }
  120.         aerr();
  121.         break;
  122.  
  123.     case S_BRA:
  124.         expr(&e1, 0);
  125.         outab(op);
  126.         if (e1.e_base.e_ap == NULL || e1.e_base.e_ap == dot.s_area) {
  127.             v1 = e1.e_addr - dot.s_addr - 1;
  128.             if ((v1 < -128) || (v1 > 127))
  129.                 aerr();
  130.             outab(v1);
  131.         } else {
  132.             outrb(&e1, R_PCR);
  133.         }
  134.         if (e1.e_mode != S_USER)
  135.             rerr();
  136.         break;
  137.  
  138.     case S_TYP1:
  139.         t1 = addr(&e1);
  140.         if (t1 == S_A) {
  141.             outab(op|A);
  142.             break;
  143.         }
  144.         if (t1 == S_B) {
  145.             outab(op|B);
  146.             break;
  147.         }
  148.         if (t1 == S_D) {
  149.             if (op == 0x44) {
  150.                 outab(0x04);
  151.                 break;
  152.             }
  153.             if (op == 0x48) {
  154.                 outab(0x05);
  155.                 break;
  156.             }
  157.             aerr();
  158.             break;
  159.         }
  160.         if (t1 == S_INDX) {
  161.             outab(op|X);
  162.             outrb(&e1, R_USGN);
  163.             break;
  164.         }
  165.         if (t1 == S_DIR) {
  166.             outab(op|0x30);
  167.             outrw(&e1, 0);
  168.             aerr();
  169.             break;
  170.         }
  171.         if (t1 == S_EXT) {
  172.             outab(op|0x30);
  173.             outrw(&e1, 0);
  174.             break;
  175.         }
  176.         aerr();
  177.         break;
  178.  
  179.     case S_TYP2:
  180.         if ((reg = admode(abdx)) == 0)
  181.             aerr();
  182.  
  183.     case S_TYP3:
  184.         if (!reg) {
  185.             reg = op & 0x40;
  186.         } else if (reg == S_A) {
  187.             reg = 0x00;
  188.         } else if (reg == S_B) {
  189.             reg = 0x40;
  190.         } else if (reg == S_D) {
  191.             if (op == 0x80) {
  192.                 op = 0x83;
  193.             } else
  194.             if (op == 0x8B) {
  195.                 op = 0xC3;
  196.             } else {
  197.                 aerr();
  198.             }
  199.             reg = 0x00;
  200.         } else {
  201.             aerr();
  202.             reg = 0x00;
  203.         }
  204.         t1 = addr(&e1);
  205.         if (t1 == S_IMMED) {
  206.             if ((op|0x40) == 0xC7)
  207.                 aerr();
  208.             if (op == 0x83 || op == 0xC3) {
  209.                 outab(op|reg);
  210.                 outrw(&e1, 0);
  211.             } else {
  212.                 outab(op|reg);
  213.                 outrb(&e1, 0);
  214.             }
  215.             break;
  216.         }
  217.         if (t1 == S_DIR) {
  218.             outab(op|reg|0x10);
  219.             outrb(&e1, R_PAG0);
  220.             break;
  221.         }
  222.         if (t1 == S_INDX) {
  223.             outab(op|reg|0x20);
  224.             outrb(&e1, R_USGN);
  225.             break;
  226.         }
  227.         if (t1 == S_EXT) {
  228.             outab(op|reg|0x30);
  229.             outrw(&e1, 0);
  230.             break;
  231.         }
  232.         aerr();
  233.         break;
  234.  
  235.     case S_TYP4:
  236.         t1 = addr(&e1);
  237.         if (t1 == S_IMMED) {
  238.             if (op&0x0D == 0x0D)
  239.                 aerr();
  240.             outab(op);
  241.             outrw(&e1, 0);
  242.             break;
  243.         }
  244.         if (t1 == S_DIR) {
  245.             outab(op|0x10);
  246.             outrb(&e1, R_PAG0);
  247.             break;
  248.         }
  249.         if (t1 == S_INDX) {
  250.             outab(op|0x20);
  251.             outrb(&e1, R_USGN);
  252.             break;
  253.         }
  254.         if (t1 == S_EXT) {
  255.             outab(op|0x30);
  256.             outrw(&e1, 0);
  257.             break;
  258.         }
  259.         aerr();
  260.         break;
  261.  
  262.     case S_TYP5:
  263.         t1 = addr(&e1);
  264.         if (t1 == S_INDX) {
  265.             outab(op);
  266.             outrb(&e1, R_USGN);
  267.             break;
  268.         }
  269.         if (t1 == S_DIR) {
  270.             outab(op|0x10);
  271.             outrw(&e1, 0);
  272.             aerr();
  273.             break;
  274.         }
  275.         if (t1 == S_EXT) {
  276.             outab(op|0x10);
  277.             outrw(&e1, 0);
  278.             break;
  279.         }
  280.         aerr();
  281.         break;
  282.  
  283.     default:
  284.         err('o');
  285.     }
  286. }
  287.  
  288.  
  289. /*
  290.  * The next character must be a
  291.  * comma.
  292.  */
  293. VOID
  294. comma()
  295. {
  296.     if (getnb() != ',')
  297.         qerr();
  298. }
  299.  
  300. /*
  301.  * Machine dependent initialization
  302.  */
  303. VOID
  304. minit()
  305. {
  306.     hd63 = 0;
  307. }
  308.